function MVVM(options) {
    this.$options = options; // this是当前new出来的vm实例,在实例上存了一下传入的配置项
    var data = this._data = this.$options.data; // 将配置项中的data在vm实例上的_data属性上存了一下
    var me = this; // 暂存了一下this到me这个变量,this是vm实例

    // 数据代理
    // 实现 vm.xxx -> vm._data.xxx
    Object.keys(data).forEach(function(key) { // Object.keys(data) -> ['msg'] -> ['msg'].forEach(function (key) {}) -> key是循环出来的,这里是'msg'
        me._proxy(key); // key是循环出来的,这里是'msg', me调用了_proxy(key) 这个方法, _proxy方法在原型上
    });

    observe(data, this);

    this.$compile = new Compile(options.el || document.body, this)
}

MVVM.prototype = {
    $watch: function(key, cb, options) {
        new Watcher(this, key, cb);
    },

    _proxy: function(key) { // key是'msg'
        var me = this; // this是谁?谁调用的当前方法,this就是谁?this就是vm实例,暂存一下到me这个变量
        Object.defineProperty(me, key, { // 给当前me(当前vm实例),添加key这个属性,key是'msg' 相当于给当前实例去添加了一个data中的属性msg这个属性
            configurable: false,
            enumerable: true,
            get: function proxyGetter() {
                return me._data[key]; // me是当前实例,_data在第三行,存到过实例上,key是"msg"
            },
            set: function proxySetter(newVal) {
                me._data[key] = newVal;
            }
        });
    }
};